package com.zx._01_基础._017_国际化;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import org.junit.Test;

/**
 * JDK 提供的国际化能力
 */
public class 国际化 {

    // 1.获得java支持的所有国家和语言的数组
    @Test
    public void test01() {
        Locale[] locales = Locale.getAvailableLocales();
        for (Locale a : locales) {
            System.out.println(a.getDisplayCountry()//显示的国家名称
                    + "=" + a.getCountry()//国家名称的缩写
                    + "," + a.getDisplayLanguage()//显示的语言名称
                    + "=" + a.getLanguage());//语言名称的缩写
        }
        // 中国=CN,中文=zh
        // 中国香港特别行政区=HK,中文=zh

        String a = "哈哈哈";
    }

    // 2. 使用国际化读取配置文件
    @Test
    public void test02() {
        /*
            现有2个配置文件
            //保存美国英文
            mess_en_US.properties	---->hello=hello!!
            //保存中国汉语
            mess_zh_CN.properties	---->hello=\u4F60\u597D  //#你好
        */

        //创建一个本地国家和语言的对象
        Locale l1 = new Locale("en", "US", "");
        ResourceBundle rb1 = ResourceBundle.getBundle("properites/mess", l1);
        System.out.println(rb1.getString("hello"));
        // hello!!

        //创建一个本地国家和语言的对象
        Locale l2 = new Locale("zh", "CN", "");
        ResourceBundle rb2 = ResourceBundle.getBundle("properites/mess", l2);
        System.out.println(rb2.getString("hello"));
        // 你好
    }

    // 3.处理占位————MessageFormat
    @Test
    public void test03() {
        /*
            现有2个配置文件
            //保存美国英文
            mess_en_US.properties	---->msg=hello,{0}!Today is{1}.
            //保存中国汉语
            mess_zh_CN.properties	---->msg=\u4F60\u597D\uFF0C{0}\uFF01\u4ECA\u5929\u662F{1}\u3002
        */

        Locale l1 = new Locale("en", "US", "");//创建一个本地国家和语言的对象
        ResourceBundle rb1 = ResourceBundle.getBundle("properites/mess", l1);
        String msg1 = MessageFormat.format(rb1.getString("msg"), "王尼玛", new Date());
        System.out.println(msg1);
        // hello,王尼玛!Today is2022/7/24 下午9:32.

        Locale l2 = new Locale("zh", "CN", "");//创建一个本地国家和语言的对象
        ResourceBundle rb2 = ResourceBundle.getBundle("properites/mess", l2);
        String msg2 = MessageFormat.format(rb2.getString("msg"), "王尼玛", new Date());
        System.out.println(msg2);
        // 你好，王尼玛！今天是2022/7/24 下午9:32。
    }

    // 4. 使用java类代替配置文件
    @Test
    public void test04() {
        /*
            ResourceBundle类的加载优先级是
            (1)baseName_zh_CN.class
            (2)baseName_zh_CN.properties
            (3)baseName_zh.class
            (4)baseName_zh.properties
            (5)baseName.class
            (6)baseName.properties
         */

        ResourceBundle rb1 = ResourceBundle.getBundle(mess_zh_CN.class.getName());
        System.out.println(rb1.getString("hello"));
        // 你好~~

        ResourceBundle rb2 = ResourceBundle.getBundle(mess_en_US.class.getName());
        System.out.println(rb2.getString("hello"));
        // hello!!
    }

    // 4.数字格式化，可以用来为国际化————NumberFormat
    @Test
    public void test05() {
        double d = 14.545646415;
        Locale[] ls = {Locale.CHINA, Locale.JAPAN, Locale.GERMAN, Locale.US};
        NumberFormat[] nf = new NumberFormat[12];
        for (int i = 0; i < ls.length; i++) {
            nf[i * 3] = NumberFormat.getNumberInstance(ls[i]);
            nf[i * 3 + 1] = NumberFormat.getPercentInstance(ls[i]);
            nf[i * 3 + 2] = NumberFormat.getCurrencyInstance(ls[i]);
        }
        for (int i = 0; i < ls.length; i++) {
            switch (i) {
                case 0:
                    System.out.println("-------------中国格式-------------");
                    break;
                case 1:
                    System.out.println("-------------日本格式-------------");
                    break;
                case 2:
                    System.out.println("-------------德国格式-------------");
                    break;
                case 3:
                    System.out.println("-------------美国格式-------------");
                    break;
                default:
                    break;
            }
            System.out.println("通用数值格式" + nf[i * 3].format(d));
            System.out.println("百分比数值格式" + nf[i * 3 + 1].format(d));
            System.out.println("货币数值格式" + nf[i * 3 + 2].format(d));
        }
        /*
            -------------中国格式-------------
            通用数值格式14.546
            百分比数值格式1,455%
            货币数值格式￥14.55
            -------------日本格式-------------
            通用数值格式14.546
            百分比数值格式1,455%
            货币数值格式￥15
            -------------德国格式-------------
            通用数值格式14,546
            百分比数值格式1.455%
            货币数值格式14,55¤
            -------------美国格式-------------
            通用数值格式14.546
            百分比数值格式1,455%
            货币数值格式$14.55
         */
    }

    // 6.时间格式化————DateFormat
    @Test
    public void test06() {
        Date d = new Date();
        Locale[] ls = {Locale.CHINA, Locale.US};
        DateFormat[] df = new DateFormat[16];
        for (int i = 0; i < ls.length; i++) {
            df[i * 8] = DateFormat.getDateInstance(DateFormat.SHORT, ls[i]);
            df[i * 8 + 1] = DateFormat.getDateInstance(DateFormat.MEDIUM, ls[i]);
            df[i * 8 + 2] = DateFormat.getDateInstance(DateFormat.LONG, ls[i]);
            df[i * 8 + 3] = DateFormat.getDateInstance(DateFormat.FULL, ls[i]);

            df[i * 8 + 4] = DateFormat.getTimeInstance(DateFormat.SHORT, ls[i]);
            df[i * 8 + 5] = DateFormat.getTimeInstance(DateFormat.MEDIUM, ls[i]);
            df[i * 8 + 6] = DateFormat.getTimeInstance(DateFormat.LONG, ls[i]);
            df[i * 8 + 7] = DateFormat.getTimeInstance(DateFormat.FULL, ls[i]);
        }
        for (int i = 0; i < ls.length; i++) {
            switch (i) {
                case 0:
                    System.out.println("-------------中国格式-------------");
                    break;
                case 1:
                    System.out.println("-------------美国格式-------------");
                    break;
                default:
                    break;
            }
            System.out.println("时区：" + df[i * 8].getTimeZone().toZoneId());
            System.out.println("SHORT格式日期" + df[i * 8].format(d));
            System.out.println("MEDIUM格式日期" + df[i * 8 + 1].format(d));
            System.out.println("LONG格式日期" + df[i * 8 + 2].format(d));
            System.out.println("FULL格式日期" + df[i * 8 + 3].format(d));

            System.out.println("SHORT格式时间" + df[i * 8 + 4].format(d));
            System.out.println("MEDIUM格式时间" + df[i * 8 + 5].format(d));
            System.out.println("SHORT格式时间" + df[i * 8 + 6].format(d));
            System.out.println("FULL格式时间" + df[i * 8 + 7].format(d));
        }
        /*
                -------------中国格式-------------
                时区：Asia/Shanghai
                SHORT格式日期2022/7/24
                MEDIUM格式日期2022年7月24日
                LONG格式日期2022年7月24日
                FULL格式日期2022年7月24日星期日
                SHORT格式时间下午9:52
                MEDIUM格式时间下午9:52:47
                SHORT格式时间CST 下午9:52:47
                FULL格式时间中国标准时间 下午9:52:47
                -------------美国格式-------------
                时区：Asia/Shanghai
                SHORT格式日期7/24/22
                MEDIUM格式日期Jul 24, 2022
                LONG格式日期July 24, 2022
                FULL格式日期Sunday, July 24, 2022
                SHORT格式时间9:52 PM
                MEDIUM格式时间9:52:47 PM
                SHORT格式时间9:52:47 PM CST
                FULL格式时间9:52:47 PM China Standard Time
         */
    }


}
